package com.sk.seckilldemo.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ消息队列配置类
 * */
@Configuration
public class RabbitMQConfig {

    /**
     * 秒杀队列
     * 第一个参数 "seckill.queue" 是队列的名称
     * 第二个参数 true 表示这个队列是持久化的(durable)，即在服务器重启后队列仍然存在
     * */
    @Bean
    public Queue seckillQueue() {
        return new Queue("seckill.queue", true);
    }

    /**
     * 秒杀交换机
     * */
    @Bean
    public DirectExchange seckillExchange() {
        return new DirectExchange("seckill.exchange");
    }

    /**
     * 将消息队列绑定到指定的交换机上
     * 并指定路由键，用于匹配消息的路由规则
     * */
    @Bean
    public Binding seckillBinding() {
        return BindingBuilder.bind(seckillQueue())      // 绑定队列
                .to(seckillExchange())                  // 绑定交换机
                .with("seckill.routing.key"); // 指定路由键
    }

    /**
     * JSON消息转换器
     * */
    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
